<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/ajax.js"></script>
</head>

<body>

</body>
<script>
    // 构造函数本身自带方法      (对比Array.isArray())
    // Promise.all()  
    // Promise.race()  

    // Promise.race()方法同样是将多个 Promise 实例，包装成一个新的 Promise 实例。
    // const p = Promise.all([p1, p2, p3]);
    // 上面代码中，Promise.race()方法接受一个数组作为参数，p1、p2、p3都是 Promise 实例,返回一个新的Promise 实例。

    // 只要p1、p2、p3之中有一个实例率先改变状态，p的状态就跟着改变。那个率先改变的 Promise 实例的返回值，就传递给p的回调函数。


    // 优点 同时发送多个请求  => 优先返回速度最快的请求的结果(成功|失败)  
    // T1
    // T2    =>  T 按最快的来
    // T3

    var p1 = readText("../data/1.txt", 100);  // 今天
    var p2 = readText("../data/2.txt", 500);  // demo_1111
    var p3 = readText("../data/3.txt", 5000); // 写了没?

    Promise.race([p1, p2, p3]).then(txt => {
        console.log(txt);
    }).catch(err => {
        console.log(err);
    })

    // 模拟封装
    /*  console.time("aa");
     Promise.myRace = function (list) {
         return new Promise(function (resolve, reject) {
             for (let i = 0; i < list.length; i++) {
                 var p = list[i];// 每一个Promise实例
 
                 // 提前规定好每一个实例 成功和失败时执行的内容  => 请求有结果之后会执行
                 p.then(txt => {  //等待异步操作有结果之后 对应下标放到数组中
                     // console.timeLog("aa");
                     resolve(txt);
                 }).catch(err => {
                     console.log(err);
                     reject(err);
                 })
             }
         })
     }
 
     Promise.myRace([p1, p2, p3]).then(txt => {
         console.log(txt);
     }).catch(err => {
         console.log(err);
     }) */









    function readText(url, delay = 0) {
        var p = new Promise(function (resolve, reject) {
            setTimeout(function () {
                $.ajax({
                    type: "get",
                    url: url,
                    success: function (text) {
                        resolve(text);
                    }
                })
            }, delay)
        })
        return p; // {pending}
    }

</script>

</html>